/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.model.service;

import com.model.domain.enaho.reporte.ListadosReporte;
import com.model.domain.enaho.reporte.ReporteRecuperacionEnvios;
import com.model.domain.persona.Hogar;
import com.model.domain.persona.HogarXml;
import com.model.domain.persona.HogarXmlTransferido;
import com.model.domain.proceso.envio.carga.LogXmlCargado;
import com.model.domain.proceso.envio.carga.EstadoCarga;
import com.model.domain.proceso.envio.subida.LogXmlTransferido;
import com.model.domain.proceso.envio.subida.ModoEnvio;
import com.model.domain.proceso.envio.subida.xml.ArchivoXmlEnaho;
import com.model.domain.proceso.envio.subida.xml.CampoXmlEnaho;
import com.model.domain.proceso.envio.subida.xml.TipoArchivoXmlEnaho;
import com.model.domain.ubicacion.Conglomerado;
import com.model.domain.ubicacion.ViviendaXml;
import com.model.domain.ubicacion.ViviendaXmlTransferido;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import util.file.Archivo;
import util.file.OperacionSubida;
import util.file.xml.TablaXml;
import util.www.sql.WhereSqlDinamico;

/**
 * @author Rdelacruz
 */
public class ViviendaXmlTransferidoService 
extends AbstractService
{     
    
    private HogarXmlTransferidoService hogarXmlTransferidoService;
    
    public void updateUltimaCarga(Connection con, LogXmlCargado logxmlcargado, EstadoCarga resultado) throws SQLException {                
        Statement st = null;
        try {
            st = con.createStatement();          
            Integer id_envio = logxmlcargado.getLogXmlTransferido().getId();
            if(id_envio==null) {
                throw new SQLException("identificador nulo en sentencia UPDATE");
            }
            int res = resultado.getId();
            String tipo = logxmlcargado.getProcesoCarga().getTipo().getCodigo();
            
            String sql = "UPDATE Envios_viviendaxmltransferidos SET"
                    + " resultadoUltimaCarga="+res+",tipoUltimaCarga='"+tipo+"'"
                    + " WHERE id_envio="+id_envio;
            st.executeUpdate(sql);
        }        
        finally {
            if(st!=null) st.close();
        }
    }    
    
    
    public void procesar(Connection con, ReporteRecuperacionEnvios rep, 
            Conglomerado filtro, 
            EstadoCarga filtroEstado,
            Boolean filtroExisteArchivoXml,
            ListadosReporte listados) 
            throws SQLException { 
        
        Statement st = null;        
        try { 
            st = con.createStatement();
            
            WhereSqlDinamico w = new WhereSqlDinamico();            
            w.and("LT.tipoxml='C'");
            w.and("C.Odei=",filtro.getOdei().getCodigo());
            w.and("C.Mes=", filtro.getMes().getCodigo());
            w.and("C.Periodo=", filtro.getPeriodo().getCodigo());
            w.and("VT.conglomerado=", filtro.getCodigo());
            
            if(filtroExisteArchivoXml!=null)
                w.and("LT.procesoCarga=1 or (LT.procesoCarga=0 and LT.existe=1)");
            
            
            String sql = "select\n" +
"VT.conglomerado, VT.vivienda, VT.xml,\n" +
"LT.IP, LT.usuario, LT.nombrexmldata, LT.fechasubidaxml, \n" +
"LT.tamanho, LT.existe, LT.procesoCarga, LT.modoenvio,\n" +
"LT.rutaxmldata, LT.id_envio\n" +
"from Envios_viviendaxmltransferidos VT\n" +
"inner join Envios_logxmltransferidos LT\n" +
"	on VT.id_envio = LT.id_envio\n" +
"left join Campo_Conglomerado C\n" +
"	on VT.conglomerado = C.Conglome	\n" +
w.getSql()+"\n"+
"order by id_envio desc"+                    
";";
            
            Map<String,ViviendaXmlTransferido> ordenEnvio = new HashMap<String,ViviendaXmlTransferido>();
            
            ResultSet rs = st.executeQuery(sql);
            while(rs.next()) {
                String nombreArchivo;
                
                ViviendaXmlTransferido vxml = new ViviendaXmlTransferido();
                vxml.setConglomerado(rs.getString("conglomerado"));
                vxml.setVivienda(rs.getString("vivienda"));
                vxml.setExisteEnXml(rs.getBoolean("xml"));
                
                LogXmlTransferido logxml = new LogXmlTransferido();
                logxml.setIp(rs.getString("ip"));
                logxml.setUsuario(rs.getString("usuario"));
                
                OperacionSubida op = new OperacionSubida();
                Archivo a = new Archivo();
                nombreArchivo = rs.getString("nombrexmldata");
                a.setNombre(nombreArchivo);
                op.setFecha(rs.getTimestamp("fechasubidaxml"));
                
                a.setTamanho(rs.getLong("tamanho"));                
                
                logxml.setExiste(rs.getBoolean("existe"));
                logxml.setProcesoCargaRealizado(rs.getBoolean("procesoCarga"));
                String modo = rs.getString("modoenvio");
                logxml.setModoEnvio( ModoEnvio.valueOf(modo) );
                
                a.setUrl(rs.getString("rutaxmldata"));
                //logxml.setDataXml(rs.getString("xml_data"));//DEMORA LA CONSULTA
                
                int id_envio = rs.getInt("id_envio");
                
                op.setArchivo(a);
                logxml.setOperacionSubida(op);
                vxml.setLogXmlTransferido(logxml);
                
                List<HogarXmlTransferido> lista = hogarXmlTransferidoService.findByIdEnvio_PorLoMenosTengaEstadoCarga(con, id_envio, filtroEstado);
                vxml.setHogares(lista);
                
                
                
                //Agregando al reporte
                rep.addFila(vxml);               
            }
            
            //Seteando el orden de envio por nombre de Archivo en orden ascendente al nroEnvio 
            //Suposicion: El reporte está en orden descendente. Entonces iteramos al reves
            List<ViviendaXmlTransferido> lista = rep.getFilas();
            for(int i=lista.size()-1; i>=0; i--) {                
                ViviendaXmlTransferido vxml = lista.get(i);
                String nombreArchivo = vxml.getLogXmlTransferido().getOperacionSubida().getArchivo().getNombre();
                       
                
                ViviendaXmlTransferido vtemp = ordenEnvio.get(nombreArchivo);
                if(vtemp==null) {
                    vtemp = new ViviendaXmlTransferido();
                    vtemp.setOrdenEnvio(1);
                    ordenEnvio.put(nombreArchivo, vtemp);
                }
                else {
                    vtemp.setOrdenEnvio(vtemp.getOrdenEnvio()+1);
                }                
                
                vxml.setOrdenEnvio(vtemp.getOrdenEnvio());
            }
        } 
        finally {
            if(st!=null) st.close();
        }
    }
    
    public void save(Connection con, ViviendaXmlTransferido vt) throws Exception {
        LogXmlTransferido logxml = vt.getLogXmlTransferido();
        ArchivoXmlEnaho arch = logxml.getArchivoXmlEnaho();
        Integer id_envio = logxml.getId();
        
        if(arch!=null && arch.getTipo()==TipoArchivoXmlEnaho.CAMPO && id_envio!=null) {
             
            PreparedStatement ps = null;//cada hogar de un Archivo XML
            try {                              
                //vt.setResultadoCarga(ResultadoCarga.NO_CARGADO);
                
                CampoXmlEnaho archCampo = (CampoXmlEnaho) arch;
                TablaXml<ViviendaXml> tvxml = archCampo.getTablaVivienda();
                TablaXml<HogarXml> thxml = archCampo.getTablaHogar();      
                
                //1.1 Leyendo datos de la Vivienda XML              
                if(tvxml.tieneRegistros()) {
                    ViviendaXml vxml = tvxml.getRegistros().get(0);                    
                    vt.setConglomerado(vxml.getConglomerado());
                    vt.setVivienda(vxml.getVivienda());
                    vt.setExisteEnXml(Boolean.TRUE);
                }
                else {
                    if(thxml.tieneRegistros()) {
                        HogarXml hxml = thxml.getRegistros().get(0);
                        vt.setConglomerado(hxml.getCodigoConglomerado());
                        vt.setVivienda(hxml.getCodigoVivienda());
                    }
                    vt.setExisteEnXml(Boolean.FALSE);
                }
                               
                //1.2 Leyendo datos de los hogares XML                                       
                List<HogarXmlTransferido> lista = new ArrayList<HogarXmlTransferido>();                 
                for(HogarXml hxml : thxml.getRegistros()) {                 
                    Hogar h = new Hogar();
                    h.setCodigo(hxml.getCodigoHogar());
                    h.setResultadoFinal(hxml.getResultadoFinalInteger());

                    HogarXmlTransferido ht = new HogarXmlTransferido();                    
                    ht.setHogar(h);
                    ht.setViviendaXmlTransferido(vt);
                    lista.add(ht);                    
                }  
                vt.setHogares(lista);
                
                //1.3 leyendo datos adicionales de los hogares XML
                vt.procesarNroMiembros(archCampo);
                vt.procesarCapitulos600(archCampo);
                
                //2.1 insertando en la tabla VIVIENDA
                String sql = "insert into Envios_viviendaxmltransferidos"
                        + "(id_envio,conglomerado, vivienda, xml)"
                        + " values (?,?,?,?)";
                ps = con.prepareStatement(sql);
                ps.setInt(1, id_envio);
                ps.setString(2, vt.getConglomerado());
                ps.setString(3, vt.getVivienda());
                ps.setBoolean(4, vt.isExisteEnXml());
                    
                ps.executeUpdate();
                
                //2.2 insertando en la tabla HOGAR
                for(HogarXmlTransferido ht : vt.getHogares()) {
                    hogarXmlTransferidoService.save(con, ht);                    
                }
            } 
            catch(Exception ex) {
                Archivo a = logxml.getOperacionSubida().getArchivo();
                throw new Exception("No se pudo registrar la Vivienda XML del archivo "+a.getNombre(),ex);
            }
            finally {
                if(ps!=null) ps.close();
            }
        }
    }
    
    
    public HogarXmlTransferidoService getHogarXmlTransferidoService() {
        return hogarXmlTransferidoService;
    }

    public void setHogarXmlTransferidoService(HogarXmlTransferidoService hogarXmlTransferidoService) {
        this.hogarXmlTransferidoService = hogarXmlTransferidoService;
    }



 
}
